from typing import List, Dict

from sqlalchemy import Column, Integer, String, Text, Float
from logger.log_config import logger
from mapper.base import Base, SessionLocal


# 定义数据表
class InterviewQuestion(Base):  # 表名可以用 InterviewQuestion 表示单条问题
    __tablename__ = 'interview_questions'

    id = Column(Integer, primary_key=True, autoincrement=True)  # 自动生成主键 ID
    company_name = Column(String(255), nullable=False)  # 公司名称
    job_position = Column(String(255), nullable=False)  # 岗位名称
    question = Column(Text, nullable=False)  # 单个面试问题内容
    score = Column(Float, nullable=False, default=5.0)  # 新增字段：问题参考分值（0-10）

    def __repr__(self):
        return f"<InterviewQuestion(id={self.id}, company_name={self.company_name}, " \
               f"job_position={self.job_position}, question={self.question}, score={self.score})>"


def insert_into_sql_with_ids(result_list: List[Dict]) -> List[Dict]:
    """
    批量插入面试问题到 SQL 表 `interview_questions`，并返回附加 ID 的数据列表
    :param session: SQLAlchemy 数据库会话
    :param result_list: 从外部传入的面试问题列表，格式如下：
        [
            {
                "company": "公司名称",
                "position": "岗位名称",
                "questions": [
                    {"question_text": "问题1", "question_score": 8.0},
                    {"question_text": "问题2", "question_score": 7.0}
                ]
            }
        ]
    :return: 带有 SQL ID 的数据列表，格式如下：
        [
            {"id": 1, "company": "公司名称", "position": "岗位名称", "question": "问题1", "score": 8.0},
            {"id": 2, "company": "公司名称", "position": "岗位名称", "question": "问题2", "score": 7.0}
        ]
    """
    session = SessionLocal()
    questions_with_ids = []  # 存储附加 ID 的数据列表

    # 遍历每个公司的面试问题集合
    for result in result_list:
        company = result["company"]
        position = result["position"]

        # 遍历公司岗位下的每个具体问题
        for question_entry in result["questions"]:
            question_text = question_entry["question_text"]
            question_score = question_entry.get("question_score", 5.0)  # 如果未提供分数，默认值为 5.0

            # 构建问题对象并插入 SQL 表
            new_question = InterviewQuestion(
                company_name=company,
                job_position=position,
                question=question_text,
                score=question_score
            )
            session.add(new_question)
            session.commit()  # 提交以生成 ID

            # 将生成的 `id` 添加到数据中
            questions_with_ids.append({
                "id": new_question.id,  # SQL 表自动生成的 ID
                "company": company,
                "position": position,
                "question": question_text,
                "score": question_score
            })

    logger.info(f"成功插入 {len(questions_with_ids)} 条数据到 SQL 数据库！")
    return questions_with_ids  # 返回带有 ID 的数据列表


def query_questions_by_company_and_position(company_name, job_position):
    """
    查询面试问题，根据公司 + 岗位名称精确匹配
    """
    session = SessionLocal()
    questions = session.query(InterviewQuestion).filter(
        InterviewQuestion.company_name == company_name,
        InterviewQuestion.job_position == job_position
    ).all()
    return questions
